import rclpy #导入ros的客户端库，必备步骤
from rclpy.node import Node #rclpy.node是ros客户端库自带的Node类，用于创建节点
from interfaces.srv import DiceGameService #interfaces是package的名字
                                    # .srv是服务接口的意思
                                    # #DiceGameService是服务的类型

class PlayerClientWithParamNode(Node):  #采用面向对象(OOP)的方式建立node； 定义了一个PlayerNode的类，继承rclpy.node中的Node；
    def __init__(self,name):  #定义初始化方法；或者叫构造函数。。(构造函数是个人的理解，源自C++)
        super().__init__(name) #调用父类初始化，需要传入参数name，通常name是实例化的Node的名称，即节点名字；
        self.get_logger().info("PlayerClientWithParamNode初始化成功！")  #get_logger().info是rclpy.node中的方法；
        #在这里意思是，当这个layerClientNode节点实例化的时候，输出一句日志；
        self.playerClient=self.create_client(DiceGameService,"diceGameServiceWithParam")
        self.req=DiceGameService.Request() #固定用法，初始化的时候定义一个req来存放request数据
        self.i=5
    
    def diceGame_callback(self,response):
        if response.result().guess_result==True:
            self.get_logger().info("恭喜你，猜对了")
        else:
            self.get_logger().info("很遗憾，猜错了")

    def diceGame(self):
        while not self.playerClient.wait_for_service(1.0):
            self.get_logger().warn("掷骰子游戏未上线")
        num=int(input("请输入点数："))
        self.req.input_num=num
        self.playerClient.call_async(self.req).add_done_callback(self.diceGame_callback)
        
def main(args=None):  #main函数，程序执行的主入口
    rclpy.init(args=args)  # 初始化客户端库，必备步骤
    node=PlayerClientWithParamNode("playerClientWithPram")  # 新建节点对象，必备步骤；传入player，将playerNode实例化
    while node.i<5:
        node.i+=1
        node.diceGame()
        rclpy.spin(node)   # spin循环节点,保持节点运行，检测是否收到退出指令（Ctrl+C），必备步骤
    rclpy.shutdown()  # 关闭客户端库，必备步骤